home *** CD-ROM | disk | FTP | other *** search
- (* Differentiating a symbolic expression -- classical LISP introduction *)
-
-
- datatype expr = ConEx of real
- | VarEx of string
- | MonEx of string * expr
- | BinEx of expr * string * expr;
-
- fun ds ("exp",e) = MonEx("exp",e)
- | ds ("sin",e) = MonEx("cos",e)
- | ds ("cos",e) = MonEx("~",MonEx("sin",e))
- | ds ("ln", e) = BinEx(ConEx 1.0,"/",e)
- | ds ("arctan",e) = BinEx(ConEx 1.0,"/",BinEx(e,"*",e));
-
- fun diff (VarEx v) va = if v=va then ConEx 1.0 else ConEx 0.0
- | diff (ConEx _) _ = ConEx 0.0
- | diff (MonEx (s,e)) v = BinEx (ds (s,e),"*",diff e v)
- | diff (BinEx (e1,"+",e2)) v = BinEx (diff e1 v,"+",diff e2 v)
- | diff (BinEx (e1,"-",e2)) v = BinEx (diff e1 v,"-",diff e2 v)
- | diff (BinEx (e1,"*",e2)) v = BinEx (BinEx(diff e1 v,"*",e2),
- "+",
- (BinEx(e1,"*",diff e2 v)))
- | diff (BinEx (e1,"/",e2)) v = BinEx (BinEx (BinEx (e2,"*",diff e1 v),
- "-",
- (BinEx (e1,"*",diff e2 v))),
- "/",
- (BinEx (e2,"*",e2)));
-
-
-